import Link from "next/link"; import { notFound } from "next/navigation"; import { ArrowLeft } from "lucide-react"; import { requireAdmin } from "@/lib/session"; import { getUserDetail } from "@/lib/queries/admin"; import { formatDate, formatNumber, truncate } from "@/lib/format"; import { PageHeader } from "@/components/ui/page-header"; import { Badge, StatusBadge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Stat, StatGrid } from "@/components/ui/stat"; import { Table, TableBody, TableCell, TableEmpty, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Alert } from "@/components/ui/alert"; import { CopyButton } from "@/components/ui/copy-button"; import { DateCell, KV, Mono, Panel, PlanBadge } from "@/components/admin/primitives"; import { UserActions } from "@/components/admin/user-actions"; export const dynamic = "force-dynamic"; export default async function AdminUserDetail({ params }: { params: Promise<{ id: string }> }) { const admin = await requireAdmin(); const { id } = await params; const d = await getUserDetail(id); if (!d) notFound(); const { user } = d; return ( <>
{user.email} {user.role === "admin" ? admin : null} {user.banned ? banned : null} {user.emailVerified ? verified : unverified} } description={ {user.id} } actions={} /> {user.banned ? ( Reason: {user.banReason || "not recorded"} ) : null}
Organization Plan Role Status Joined {d.memberships.length === 0 ? ( No memberships. ) : ( d.memberships.map((m) => ( {m.name} {m.role} {m.suspended ? : } )) )}
Created Expires IP User agent {d.sessions.length === 0 ? ( Never logged in. ) : ( d.sessions.map((s) => ( {s.ipAddress ?? "—"} {s.userAgent ?? "—"} )) )}
When Action Target Metadata IP {d.audit.length === 0 ? ( No audit entries. ) : ( d.audit.map((a) => ( {a.action} {a.target ?? "—"} {a.metadata ? JSON.stringify(a.metadata) : "—"} {a.ipAddress ?? "—"} )) )}
); }